package com.itany.shop.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author 石小俊
 * @date 2023年10月30日 15:04
 * 黑名单过滤器
 * 要求在当前过滤器中设置初始化参数
 * 将所有黑名单用户的ip地址设置在参数中
 * 所有处于黑名单中的用户均无法访问我们的服务
 * 如果是黑名单用户进行访问,则直接提示:您的用户权限有问题,请联系客服进行解决
 * 要求这些黑名单中的所有名单随便可变,可以增加,可以修改,可以删除
 * 功能实现之后,更改黑名单用户时只需要修改初始化参数的内容
 * 具体实现代码不允许改动
 */
//@WebFilter(urlPatterns = "/*",initParams = {
//        @WebInitParam(name = "blackList",value = "192.168.111.77,192.168.111.71,192.168.111.239")
//})
public class BlackListFilter implements Filter {
    private FilterConfig config;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 获取访问者的ip地址
        String ip = request.getRemoteAddr();

        // 获取初始化参数中所有的黑名单用户的ip地址
        String blackList = config.getInitParameter("blackList");
        // 由于黑名单中多个ip地址是通过逗号拼接的
        // 因此,此时通过逗号将其分割为数组
        String[] ips = blackList.split(",");
        // 遍历这些黑名单,查看当前访问者是否在黑名单中
        for(String s : ips){
            // 如果黑名单中存在访问者ip,则无法访问
            if(s.equals(ip)){
//                response.setContentType("text/html;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.println("<h1 style='color:red;'>您的用户权限有问题,请联系客服进行解决</h1>");
                return;
            }
        }
        // 如果访问者ip不在黑名单中,则直接放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}